#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>

#include <sys/types.h>
#include <sys/wait.h>
#include <>

using namespace std;

int main()
{
    signal(SIGCHLD, SIG_IGN);
    if (fork() == 0)
    {
        cout << "child pid: " << getpid() << endl;
        sleep(5);
        exit(1);
    }
    while (true)
    {
        cout << "parent pid: " << getpid() << endl;
        sleep(1);
    }
    return 0;
}



// void handler(int signum)
// {
//     cout << "捕捉到了信号：" << signum << endl;
// }

// int main()
// {
//     signal(SIGCHLD, handler);
//     pid_t id = fork();
//     if (id == 0)
//     {
//         int n = 5;
//         while (n--)
//         {
//             cout << "I am child, pid: " << getpid() << endl;
//             sleep(1);
//         }
//         exit(1);
//     }
//     waitpid(id, nullptr, 0);
    
//     return 0;
// }   

// void showPending(sigset_t* pending)
// {
//     for (int i = 1;i <= 31; i++)
//     {
//         if (sigismember(pending, i)) cout << " 1";
//         else cout << " 0";
//     }
//     cout << endl;
// }

// void handler(int signum)
// {
//     cout << "获取了一个信号：" << signum << endl;
//     sigset_t pending;
//     int i = 0;
//     while (i++ < 10)
//     {
//         sigpending(&pending);
//         showPending(&pending);
//         sleep(1);
//     }
// }

// int main()
// {
//     // 内核数据类型，用户栈定义
//     struct sigaction act, oact;

//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask); // 初始化信号屏蔽字
//     act.sa_handler = handler; // 捕捉方法

//     // 再设置信号屏蔽
//     // sigaddset(&act.sa_mask, 3);
//     // sigaddset(&act.sa_mask, 4);
//     // sigaddset(&act.sa_mask, 5);
//     // sigaddset(&act.sa_mask, 6);
//     // sigaddset(&act.sa_mask, 7);

//     // 设置进当前进程的PCB中
//     sigaction(2, &act, &oact);
//     // 默认处理动作
//     cout << "default action: " << (int)(oact.sa_handler) << endl;
//     cout << "pid: " << getpid() << endl;
//     while (true) sleep(1);

//     return 0;
// }